#ifndef _TERMIOS_H
#define _TERMIOS_H

#define TTY_BUF_SIZE 1024

/* 0x54 is just a magic number to make these relatively uniqe ('T') */

#define TCGETS       0x5401
#define TCSETS       0x5402
#define TCSETSW      0x5403
#define TCSETSF      0x5404
#define TCGETA       0x5405
#define TCSETA       0x5406
#define TCSETAW      0x5407
#define TCSETAF      0x5408
#define TCSBRK       0x5409
#define TCXONC       0x540A
#define TCFLSH       0x540B
#define TIOCEXCL     0x540C
#define TIOCNXCL     0x540D
#define TIOCSCTTY    0x540E
#define TIOCGPGRP    0x540F
#define TIOCSPGRP    0x5410
#define TIOCOUTQ     0x5411
#define TIOCSTI      0x5412
#define TIOCGWINSZ   0x5413
#define TIOCSWINSZ   0x5414
#define TIOCMGET     0x5415
#define TIOCMBIS     0x5416
#define TIOCMBIC     0x5417
#define TIOCMSET     0x5418
#define TIOCGSOFTCAR 0x5419
#define TIOCSSOFTCAR 0x541A
#define TIOCINQ      0x541B

struct winsize {
    unsigned short ws_row;
    unsigned short ws_col;
    unsigned short ws_xpixel;
    unsigned short ws_ypixel;
};

#define NCC 8
struct termio {
    unsigned short c_iflag;  /* input mode flags */
    unsigned short c_oflag;  /* output mode flags */
    unsigned short c_cflag;  /* control mode flags */
    unsigned short c_lflag;  /* local mode flags */
    unsigned char c_line;    /* line discipline */
    unsigned char c_cc[NCC]; /* control characters */
};

#define NCCS 17
struct termios {
    unsigned long c_iflag;    /* input mode flags */
    unsigned long c_oflag;    /* output mode flags */
    unsigned long c_cflag;    /* control mode flags */
    unsigned long c_lflag;    /* local mode flags */
    unsigned char c_line;     /* line discipline */
    unsigned char c_cc[NCCS]; /* control characters */
};

/* c_cc characters */
#define VINTR     0
#define VQUIT     1
#define VERASE    2
#define VKILL     3
#define VEOF      4
#define VTIME     5
#define VMIN      6
#define VSWTC     7
#define VSTART    8
#define VSTOP     9
#define VSUSP     10
#define VEOL      11
#define VREPRINT  12
#define VDISCARD  13
#define VWERASE   14
#define VLNEXT    15
#define VEOL2     16

/* c_iflag bits */
#define IGNBRK    0000001
#define BRKINT    0000002
#define IGNPAR    0000004
#define PARMRK    0000010
#define INPCK     0000020
#define ISTRIP    0000040
#define INLCR     0000100
#define IGNCR     0000200
#define ICRNL     0000400
#define IUCLC     0001000
#define IXON      0002000
#define IXANY     0004000
#define IXOFF     0010000
#define IMAXBEL   0020000

/* c_oflag bits */
#define OPOST     0000001
#define OLCUC     0000002
#define ONLCR     0000004
#define OCRNL     0000010
#define ONOCR     0000020
#define ONLRET    0000040
#define OFILL     0000100
#define OFDEL     0000200
#define NLDLY     0000400
#define NL0       0000000
#define NL1       0000400
#define CRDLY     0003000
#define CR0       0000000
#define CR1       0001000
#define CR2       0002000
#define CR3       0003000
#define TABDLY    0014000
#define TAB0      0000000
#define TAB1      0004000
#define TAB2      0010000
#define TAB3      0014000
#define XTABS     0014000
#define BSDLY     0020000
#define BS0       0000000
#define BS1       0020000
#define VTDLY     0040000
#define VT0       0000000
#define VT1       0040000
#define FFDLY     0040000
#define FF0       0000000
#define FF1       0040000

/* c_cflag bit meaning */
#define CBAUD     0000017
#define B0        0000000 /* hang up */
#define B50       0000001
#define B75       0000002
#define B110      0000003
#define B134      0000004
#define B150      0000005
#define B200      0000006
#define B300      0000007
#define B600      0000010
#define B1200     0000011
#define B1800     0000012
#define B2400     0000013
#define B4800     0000014
#define B9600     0000015
#define B19200    0000016
#define B38400    0000017
#define EXTA      B19200
#define EXTB      B38400
#define CSIZE     0000060
#define CS5       0000000
#define CS6       0000020
#define CS7       0000040
#define CS8       0000060
#define CSTOPB    0000100
#define CREAD     0000200
#define CPARENB   0000400
#define CPARODD   0001000
#define HUPCL     0002000
#define CLOCAL    0004000
#define CIBAUD    03600000     /* input baud rate (not used) */
#define CRTSCTS   020000000000 /* flow control */

#define PARENB    CPARENB
#define PARODD    CPARODD

/* c_lflag bits */
#define ISIG      0000001
#define ICANON    0000002
#define XCASE     0000004
#define ECHO      0000010
#define ECHOE     0000020
#define ECHOK     0000040
#define ECHONL    0000100
#define NOFLSH    0000200
#define TOSTOP    0000400
#define ECHOCTL   0001000
#define ECHOPRT   0002000
#define ECHOKE    0004000
#define FLUSHO    0010000
#define PENDIN    0040000
#define IEXTEN    0100000

/* modem lines */
#define TIOCM_LE  0x001
#define TIOCM_DTR 0x002
#define TIOCM_RTS 0x004
#define TIOCM_ST  0x008
#define TIOCM_SR  0x010
#define TIOCM_CTS 0x020
#define TIOCM_CAR 0x040
#define TIOCM_RNG 0x080
#define TIOCM_DSR 0x100
#define TIOCM_CD  TIOCM_CAR
#define TIOCM_RI  TIOCM_RNG

/* tcflow() and TCXONC use these */
#define TCOOFF    0
#define TCOON     1
#define TCIOFF    2
#define TCION     3

/* tcflush() and TCFLSH use these */
#define TCIFLUSH  0
#define TCOFLUSH  1
#define TCIOFLUSH 2

/* tcsetattr uses these */
#define TCSANOW   0
#define TCSADRAIN 1
#define TCSAFLUSH 2

typedef int speed_t;

extern speed_t cfgetispeed(struct termios *termios_p);
extern speed_t cfgetospeed(struct termios *termios_p);
extern int cfsetispeed(struct termios *termios_p, speed_t speed);
extern int cfsetospeed(struct termios *termios_p, speed_t speed);
extern int tcdrain(int fildes);
extern int tcflow(int fildes, int action);
extern int tcflush(int fildes, int queue_selector);
extern int tcgetattr(int fildes, struct termios *termios_p);
extern int tcsendbreak(int fildes, int duration);
extern int tcsetattr(int fildes, int optional_actions,
                     struct termios *termios_p);

#endif
